知识点名称:SharedPreference
编号: K7-2
前驱知识点编号:K7-1,K1-1,K3-1,K4-1
作者:
讲义内容:
SharedPreferences适合保存配置参数等类型的数据,例如是否打开手机震动、是否开启Wifi等,这样的数据一般都是键-值对形式。
7.2.1 SharedPreferences简介
SharedPreferences本身是一个接口,提供了访问键-值对形式数据的方法。它还提供了两个内部嵌套接口:
interface SharedPreferences.Editor:该接口允许用户写入或修改键值对。
interface SharedPreferences.OnSharedPreferenceChangeListener:该接口定义了当键值对数据发生改变时的回调函数。这样当键值对发生改变时用户可以编写代码来进行响应。
SharedPreferences提供了如下方法来访问数据:
boolean contains(String key):检查SharedPreferences是否包含键为key的数据。
XXX getXXX(String key,XXX defValue):获得SharedPreferences中键为key的数据,如果不存在键为key的键值对,则返回默认值defValue。XXX为类型,可以为boolean,float,int,long,String等。
Map<String, ?> getAll():返回SharedPreferences所有的键值对。
SharedPreferences.Editor edit():新创建SharedPreferences.Editor实例并返回该实例。
SharedPreferences.Editor是SharedPreferences的内部接口。用户使用它可以写入或修改数据。
void apply():当编辑完后提交数据。该操作会修改SharedPreferences中的数据。
SharedPreferences.Editor clear():删除SharedPreferences中所有的数据。
boolean commit():当编辑完后提交数据,该操作会修改SharedPreferences中的数据。该方法和apply不同之处在于:commit是同步提交到磁盘上,而apply是将修改数据原子提交到内存,然后异步提交到磁盘上,这样当数据多次修改时,apply会直接覆盖内存中的数据,一定程度上提高了运行效率,但是apply没有返回值,也没有错误提示。一般建议使用aplly()提交修改。
SharedPreferences.Editor remove(String key):删除SharedPreferences中的键为key的键值对。
SharedPreferences.Editor putXXX(String key,XXX value):向SharedPreferences写入key-value键值对数据。
对于用户来说,不能够创建SharedPreferences实例,只能够通过getSharedPreferences(String name, int mode)来获得。该方法如下:
public abstract SharedPreferences getSharedPreferences (String name, int mode)
其中name为文件名,如果该文件不存在,getSharedPreferences()会自动在提交数据时创建该文件。mode为操作方式,有如下取值:
MODE_PRIVATE:SharedPreferences只能够被应用程序使用,为安全起见,推荐使用。
MODE_WORLD_READABLE:系统中所有程序都可以对SharedPreferences进行读操作。
MODE_WORLD_WRITEABLE:系统中所有程序都可以对SharedPreferences进行写操作。
显然MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE模式不安全,因此在Android 4.2(API 17)后已经不推荐使用。
从上面的分析可以看出,向SharedPreferences读数据一般步骤为:
1、 使用getSharedPreferences()通过获得SharedPreferences实例。
2.、使用SharedPreferences的getXXX(String key,XXX defValue)方法获得键key对应的值。
向SharedPreferences写数据的一般步骤为:
1、getSharedPreferences()通过获得SharedPreferences实例。
2、通过SharedPreferences.edit()方法获得SharedPreferences.Editor实例。
3、使用SharedPreferences.Editor的putXXX(String key,XXX value)写入键值对。
4、使用SharedPreferences.Editor的apply()或commit()提交数据,将数据写入到SharedPreferences中。
7.2.2 SharedPreferences演示
在下面的例子中,MainActivity有两个按钮,一个执行写操作,一个执行读操作。
public class MainActivity extends AppCompatActivity {
//SharedPreferences文件名
private final static String SharedPreferencesFileName="config";
//键
private final static String Key_UserName="UserName";//用户名
private final static String Key_LoginDate="LoginDate";//登录时间
private final static String Key_UserType="UserType";
SharedPreferences preferences;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获得SharedPreferences实例
preferences=getSharedPreferences(SharedPreferencesFileName, MODE_PRIVATE);
editor=preferences.edit();
Button btnWrite=(Button)findViewById(R.id.ButtonWrite);
Button btnRead=(Button)findViewById(R.id.ButtonRead);
btnWrite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//格式化日期,将日期按照年月日时分秒格式转换为字符串形式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strLoginDate = simpleDateFormat.format(new Date());
//写入键值对
editor.putString(Key_UserName, "Zhang san");
editor.putString(Key_LoginDate, strLoginDate);
editor.putInt(Key_UserType, 1);
//提交修改,此处换成commit()也可以
editor.apply();
}
});
btnRead.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) {
String strUserName = preferences.getString(Key_UserName, null);
String strLoginDate = preferences.getString(Key_LoginDate, null);
int nUserType=preferences.getInt(Key_UserType,0);
if (strUserName != null && strLoginDate != null)
Toast.makeText(MainActivity.this, "用户名:" + strUserName + "登录时间:" + strLoginDate+"用户类型:"+
nUserType, Toast.LENGTH_LONG).show();
else
Toast.makeText(MainActivity.this, "无数据", Toast.LENGTH_LONG).show();
}
});
}
}
7.2.3 SharedPreferences存储位置
那么SharedPreferences存储在Android系统的什么地方呢?打开Android Device Monitor并切换到File Explorer,在\/data\/data\/<Package>\/shared_prefs\/目录可以看到刚才创建的config.xml文件,如下图所示:
可以看到SharedPreferences是以XML文件格式存在的,可以点击工具栏上的“导出”将文件导出到计算机上,打开后可以看到文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="UserName">Zhang san</string>
<string name="LoginDate">
<int name="UserType" value="1" />
</map>
可以清楚地看到,数据在SharedPreferences中以键值对形式存在。